from functools import wraps
from typing import Callable, Any
from fastapi import Request, HTTPException
from response import error_response  # 导入你的错误响应函数


def catch_exceptions(default_code: int = 500):
    """
    捕获函数执行中的异常，并返回标准化错误响应,如果需要，可在指定的方法上写明
    
    :param default_code: 默认错误码，默认为500
    """
    def decorator(func: Callable) -> Callable:
        @wraps(func)  # 保留原函数的元数据（如函数名、文档字符串）
        async def wrapper(*args, **kwargs) -> Any:
            try:
                # 执行原函数（路由处理逻辑）
                return await func(*args, **kwargs)
            except HTTPException as e:
                # 处理 FastAPI 内置的 HTTPException（如 404、400 等）
                return error_response(message=e.detail, code=e.status_code)
            except Exception as e:
                # 处理其他所有异常
                return error_response(message=f"操作失败: {str(e)}", code=default_code)
        return wrapper
    return decorator
